package java8.timeutil;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalQuery;

/**
 * @author Cheng Jun
 * @version 1.0
 * Description: jdk1.8 LocalTime API学习
 * 我的博客地址：https://blog.csdn.net/cauchy6317/article/details/99298830
 * @date 2019/8/10 10:02
 */
public class LocalTimeStudy {

    public static void main(String[] args) {
        //获取当前时间（带有毫秒）：09:40:44.721
        LocalTime timeMills = LocalTime.now();
        timeMills.toString();

        //在 timeMills 基础上获取不带毫秒的 time: 09:40:44
        //nanoSecond 纳秒，十亿分之一秒
        // LocalTime time = timeMills.withNano(0);
        LocalTime time = LocalTime.of(9, 40, 44);

        //午餐时间的LocalTime对象lunchtime：12:00 （注意：second为00，会省略second）
        LocalTime lunchtime = LocalTime.of(12, 00, 00);

        //午休时间的LocalTime对象lunchBreak：12:30
        LocalTime lunchBreak = LocalTime.parse("12:30:00");

        //下午茶时间的LocalTime对象：15:30:30
        LocalTime teaTime = LocalTime.ofSecondOfDay(15 * 3600 + 30 * 60 + 30);

        //加班时间的LocalTime对象：00:00
        LocalTime overtime = LocalTime.MIDNIGHT;

        //下班时间的LocalTime对象：18:00
        LocalTime closingTime = LocalTime.from(LocalTime.of(18, 00));

        //获取time的小时数：9
        int hour = time.getHour();

        //获取time的分钟数：40
        int minute = time.getMinute();

        //获取time的秒数：44
        int second = time.getSecond();

        //判断下午茶是不是在午休之后：true
        boolean flag = teaTime.isAfter(lunchBreak);

        //判断下午茶是不是在下班之前：true
        boolean flag1 = teaTime.isBefore(closingTime);

        //下午茶与午休比较大小：1
        int comparativeResult = teaTime.compareTo(lunchBreak);

        //下午茶与下班时间比较大小：-1
        int comparativeResult1 = teaTime.compareTo(closingTime);

        //time的1小时5分钟后的LocalTime对象：10:45:44
        LocalTime nextHour = time.plusHours(1).withMinute(5);

        //项目发布日的LocalDate对象：2019-08-31
        LocalDate releaseDate = LocalDate.of(2019, 8, 31);

        //项目发布日加班的日期时间 LocalDateTime对象：2019-08-31T00:00 （T的由来：toString方法加了T作为间隔）
        LocalDateTime overtimeForRelease = overtime.atDate(releaseDate);

        //定义日期时间中文表达格式：**时**分**秒
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH时mm分ss秒");

        //根据timeFormatter获取time的中文表达式：09时40分55秒
        String timeString = time.format(timeFormatter);

        //根据timeFormatter获取lunchtime的中文表达式：12时00分00秒 （注意：second为00时，不会省略second）
        String lunchtimeString = lunchtime.format(timeFormatter);

        //根据TemporalUnit将对time进行截取（小于TemporalUnit的单位设置为0）： 11：00
        LocalTime truncatedTime = time.truncatedTo(ChronoUnit.HOURS);

        //计算time距离lunchtime的时间差，结果以TemporalUnit作为单位
        long remainingTime = time.until(lunchtime, ChronoUnit.MINUTES);

        //待研究
        TemporalQuery<LocalDate> localDateTemporalQuery = new TemporalQuery<LocalDate>() {
            @Override
            public LocalDate queryFrom(TemporalAccessor temporal) {
                return null;
            }
        };
        LocalDate localDate = time.query(localDateTemporalQuery);

        System.out.println(timeString);
        System.out.println(comparativeResult1);

    }
}
